package com.aconcagua.mvc.factory {
  import com.aconcagua.beans.BeanDefinitionFactory;
  import com.aconcagua.beans.BeanDefinitionSupport;
  import com.aconcagua.factory.BeanFactory;
  
  import mx.core.IMXMLObject;

  [DefaultProperty("metadata")]
  public class Command implements BeanDefinitionFactory, IMXMLObject {
    private var _id: String;
    private var _bean: BeanDefinitionSupport;
    private var _metadata: Array;
    public var type: Class;
    
    public function Command() {
      _metadata = new Array();
    }

    public function get id(): String {
      return _id;
    }

    public function set metadata(beanMetadata: Array): void {
      _metadata = beanMetadata;
    }

    public function initialized(document:Object, id:String):void {
      _id = id;
    }
    
    public function registerIn(beanFactory:BeanFactory): void {
      //TODO: Test case
      if (_id == null) {
        throw new CommandDefinitionException();
      }

      _bean = new BeanDefinitionSupport(type, _id);
      _bean.scope = BeanDefinitionSupport.SCOPE_PROTOTYPE;
      _bean.metadata = _metadata;

      beanFactory.registerBeanDefinition(_bean);
    }
    
    public function isRegisteredIn(beanFactory: BeanFactory): Boolean {
      return _bean != null && beanFactory.containsBean(_bean.name);
    }
    
    public function retrieveFrom(beanFactory: BeanFactory): Object {
      return beanFactory.getBean(_bean.name);
    }
  }
}